<?PHP
/**
*
*	Класс для построений динамическонго DataGrid
*   Все параметры передаются в указаную модель
*
*/

class FRM_View_DataGrid
{
	/**
	 * Ссылка на текущее представнеи
	 *
	 * @var Zend_View_Interface
	 */
	private $_view = null;
	
	/**
	 * Ссылка на модель
	 *
	 * @var FRM_Db_Table_Abstract
	 */
	private $_model = null;
	
	/**
	*	Условия поиска
	* 
    *	@var mixed SQL WHERE clause
    */
	private $_where = null;

	/**
    *	От в лимите
    * 
    *	@var Integer SQL LIMIT offset
    */
	private $_intOffset = 0;

	/**
    *	Количество записей в лимите
    * 
    *	@var Integer SQL LIMIT clause
    */
	private $_intLimit = 25;

	/**
    *	Условие сотрирование
    * 
    *	@var String SQL ORDER BY column name
    */
	private $_strOrderCol  = null;

	/**
    *	Порядок сортирование
    * 
    *	@var String SQL ORDER BY sort direction ASC or DESC
    */
	private $_strSortDir  = null;


	/**
    *	Общее количество записей
    * 
    *	@var Integer Total number of rows returned from query.
    */
	private $_intTotalRows  = null;

	/**
    *	Название хтмл таблицы
    * 
    *	@var String	HTML valid table NAME property
    */
	private $_strTableName  = null;

	/**
    *	ID Хтмл талбыцм
    * 
    *	@var String	HTML valid table ID property
    */
	private $_strTableID  = null;

	/**
    *	Масий заголовков таблицы (поля)
    * 
    *	@var Array Datagrid column headers
    */
	private $_aColumnHeaders  = array();

	/**
    *	Масив записей в таблице
    *	
    *	@var Array
    */
	private $_aRows = array();
	
	
	/**
	 * Конструктор
	 *
	 * @param FRM_Db_Table $model
	 * @param Zend_View_Interface $view
	 */
	public function __construct($model, $view)
	{
		//Назначаем модель
		$this->setModel($model);
		
		//Назначаем преставление
		$this->setView($view);
	}

	/**
	 * Метод для назначения модели
	 *
	 * @param FRM_Db_Table $model
	 */
	public function setModel($model)
	{
		$this->_model = $model;

	} 
	
	/**
	 * Метод для назначения преставления
	 *
	 * @param Zend_View_Interface $view
	 */
	public function setView($view)
	{
		$this->_view = $view;

	}

	/**
	 * Метод для назначения условия поиска
	 *
	 * @param mixed $strWhere
	 */
	public function setWhere($where)
	{
		$this->_where = $where;
	} 


	/**
	 * Метод для назначения количевства отбражаемых записей
	 *
	 * @param int $intLimit
	 */
	public function setLimit($intLimit)
	{
		$this->_intLimit = (int)$intLimit;
	} 

	/**
	 * Метод для назначения от для лимита
	 *
	 * @param int $intOffset
	 */
	public function setOffset($intOffset)
	{
		$this->_intOffset = (int)$intOffset;
	} 


	/**
	 * Метод для назначения условия сортировки
	 *
	 * @param string $strCol
	 */
	public function setOrderCol($strCol)
	{
		$this->_strOrderCol = (string)trim($strCol);
	} 


	/**
	 * Метод для назначения порядка сортировки
	 *
	 * @param string $strOrder
	 */
	public function setSortDir($strOrder)
	{
		if ($strOrder == "ASC" || $strOrder=="DESC"){
			$this->_strSortDir = (string)trim($strOrder);
		}else{
			$this->_strSortDir = "ASC";
		}
	} 

	/**
	 * Метод для назначения имя таблицы
	 *
	 * @param string $strName
	 */
	public function setTableName($strName)
	{
		$this->_strTableName = trim($strName);
	}


	/**
	 * Метод для назначения ИД таблицы
	 *
	 * @param string $strID
	 */
	public function setTableID($strID)
	{
		$this->_strTableID = ' ' . trim($strID) . ' ';
	} 


	/**
	 * Метод для назначения столбцов
	 *
	 * @param array $aCols
	 */
	public function setColumnHeaders($aCols)
	{
		$this->_aColumnHeaders = $aCols;
	} 


	/**
	 * Метод для назначения количевства записей в дв таблице
	 *
	 * @param int $intTotalRows
	 */
	public function setTotalRows($intTotalRows)
	{
		$this->_intTotalRows = (int)$intTotalRows;

	} 

	/**
	 * Метод для назначения записей
	 *
	 * @param array $aRows
	 */
	private function setRows($aRows)
	{
		$this->_aRows = $aRows;
	} 

	/**
	 * Метод для получение имени таблицы
	 *
	 * @return string
	 */
	public function getTableName()
	{
		return (string)$this->_strTableName;

	} 


	/**
	 * Метод для получение ID таблицы
	 *
	 * @return string
	 */
	public function getTableID()
	{
		return (string)$this->_strTableID;

	} 

	/**
	 * Метод для для построения грида. 
	 *
	 */
	public function renderDataGrid()
	{
		//Генерим хидер
		$this->_renderColumnHeaders();
		
		//Генерим записи
		$this->_renderRows();
		
		//Генерим футер
		$this->_renderNavigation();
	}

	/**
	 * Генерация хидера
	 *
	 */
	private function _renderColumnHeaders()
	{
		
		
		//Назначаем параметры
		$dataGrid['aColumnHeaders'] = $this->_aColumnHeaders;
		$dataGrid['countHeaders'] = count($this->_aColumnHeaders)+1;
		$dataGrid['orderCol'] = $this->_strOrderCol;
		$dataGrid['sortDir'] = $this->_strSortDir;
		
		//Сохраняем текущуй dataGrid в преставление
		$this->_view->dataGrid = $dataGrid;
	}


	/**
	 * Генерация записей
	 *
	 */
	private function _renderRows()
	{
		//Получаем текущуй dataGrid с преставления
		$dataGrid = $this->_view->dataGrid;
		
		// Получаем текущую сортировку
		$order = ($this->_strOrderCol)?"{$this->_strOrderCol} {$this->_strSortDir}":false;
		
		//Достаем с модели щаписи (по условию поиска и сортировки в указаном количевстве)
		$this->_aRows = $this->_model->getList($this->_where, $order, $this->_intLimit, $this->_intOffset);
		
		//Назначаем переменную
		$dataGrid['aRows'] = $this->_aRows;
		
		//Сохраняем текущуй dataGrid в преставление
		$this->_view->dataGrid = $dataGrid;
	} 


	/**
	 * Enter description here...
	 *
	 */
	private function _renderNavigation()
	{
		//Получаем текущуй dataGrid с преставления
		$dataGrid = $this->_view->dataGrid;
		
		//Получаем количевство записей в базе с модели по указаном условии поиска
		$this->_intTotalRows = $this->_model->getRowCounts($this->_where);
		
		//Назначаем параметры футера
				
		$next = $this->_intOffset + $this->_intLimit;
		if ($next > $this->_intTotalRows)
		{
			$next = $this->_intTotalRows;
		}

		$prev = $this->_intOffset - $this->_intLimit;
		$end = $this->_intTotalRows - $this->_intLimit;
		
		$dataGrid['offset'] = $this->_intOffset;
		
		$dataGrid['rowsFrom'] = $this->_intOffset+1;
		$dataGrid['rowsTo'] = $next;
		$dataGrid['totalRows'] = $this->_intTotalRows;
		
		$dataGrid['prev'] = $prev;
		$dataGrid['limit'] = $this->_intLimit;
		$dataGrid['next'] = $next;
		$dataGrid['end'] = $end;
		
		$dataGrid['page'] = ceil($next / $this->_intLimit);
		$dataGrid['pageOf'] = ceil($this->_intTotalRows / $this->_intLimit);
		
		//Сохраняем текущуй dataGrid в преставление
		$this->_view->dataGrid = $dataGrid;
		
		
	}

}
?>
